//package com.yunhe.device.service.base.impl;
//
//import com.yunhe.device.domain.base.PointDataType;
//import com.yunhe.device.domain.base.PointMeasureType;
//import com.yunhe.common.exception.ArgumentErrorException;
//import com.yunhe.common.exception.DatabaseProcessException;
//import com.yunhe.common.exception.ObjectNotFoundException;
//import com.yunhe.common.exception.UniqueConstraintsException;
//import com.yunhe.device.repository.base.PointDataTypeRepository;
//import com.yunhe.device.service.base.PointDataTypeService;
//import com.yunhe.device.service.base.PointMeasureTypeService;
//import com.yunhe.common.util.QueryUtil;
//import com.yunhe.common.util.StringUtil;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.stereotype.Service;
//import org.springframework.transaction.annotation.Transactional;
//
//import java.util.ArrayList;
//import java.util.List;
//import java.util.Optional;
//
///**
// * 点号数据类型Service
// * @desc 点号数据类型服务类实现
// * @author liuronglei
// */
//@Service
//public class PointDataTypeServiceImpl implements PointDataTypeService {
//    @Autowired
//    private PointDataTypeRepository pointDataTypeRepository;
//    @Autowired
//    private PointMeasureTypeService pointMeasureTypeService;
//
//    /**
//     * 点号数据类型对象处理和判断
//     * @param pointDataType 点号数据类型对象
//     */
//    private void processBeforeSave(PointDataType pointDataType)
//            throws ArgumentErrorException, UniqueConstraintsException, ObjectNotFoundException {
//        //判断点号数据类型代码、编号、标题是否为空
//        if (pointDataType.getCode() == null
//                || StringUtil.isEmpty(pointDataType.getName())
//                || StringUtil.isEmpty(pointDataType.getTitle())) {
//            throw new ArgumentErrorException("点号数据类型代码、编号、标题不能为空");
//        }
//        //判断代码是否已存在
//        PointDataType typeByCode = this.findByCode(pointDataType.getCode());
//        if (typeByCode != null) {
//            if (pointDataType.getId() == null || typeByCode.getId().longValue() != pointDataType.getId().longValue()) {
//                throw new UniqueConstraintsException("该点号数据类型代码已存在");
//            }
//        }
//        //判断编号是否已存在
//        PointDataType typeByName = this.findByName(pointDataType.getName());
//        if (typeByName != null) {
//            if (pointDataType.getId() == null || typeByName.getId().longValue() != pointDataType.getId().longValue()) {
//                throw new UniqueConstraintsException("该点号数据类型编号已存在");
//            }
//        }
//        //如果序号为空，则默认为代码
//        if (pointDataType.getSn() == null && pointDataType.getCode() != null) {
//            pointDataType.setSn(pointDataType.getCode());
//        }
//        PointMeasureType pointMeasureType = pointDataType.getPointMeasureType();
//        if (pointMeasureType != null && pointMeasureType.getId() != null) {
//            PointMeasureType measureType = pointMeasureTypeService.findByPointMeasureTypeId(pointMeasureType.getId());
//            if (measureType != null) {
//                pointDataType.setPointMeasureType(measureType);
//            } else {
//                throw new ObjectNotFoundException("找不到要绑定的四遥类型");
//            }
//        }
//    }
//
//    /**
//     * 新增点号数据类型
//     * @param pointDataType 点号数据类型对象
//     */
//    @Override
//    @Transactional
//    public PointDataType createPointDataType(PointDataType pointDataType)
//            throws ArgumentErrorException, UniqueConstraintsException, ObjectNotFoundException {
//        pointDataType.setId(null);
//        processBeforeSave(pointDataType);
//        return pointDataTypeRepository.save(pointDataType);
//    }
//
//    /**
//     * 批量新增点号数据类型
//     * @param pointDataTypeList 点号数据类型对象列表
//     */
//    @Override
//    @Transactional
//    public Iterable<PointDataType> createPointDataType(List<PointDataType> pointDataTypeList)
//            throws ArgumentErrorException, UniqueConstraintsException, ObjectNotFoundException {
//        List<PointDataType> newPointDataTypeList = new ArrayList<>();
//        for (PointDataType pointDataType : pointDataTypeList) {
//            PointDataType newPointDataType = createPointDataType(pointDataType);
//            newPointDataTypeList.add(newPointDataType);
//        }
//        return newPointDataTypeList;
//    }
//
//    /**
//     * 删除点号数据类型
//     * @param pointDataTypeId 点号数据类型ID
//     */
//    @Override
//    @Transactional(rollbackFor = Exception.class)
//    public void deletePointDataType(Long pointDataTypeId) {
//        pointDataTypeRepository.deleteById(pointDataTypeId);
//    }
//
//    /**
//     * 更新点号数据类型（更新全部字段）
//     * @param pointDataType 点号数据类型对象
//     */
//    @Override
//    @Transactional
//    public PointDataType updatePointDataType(PointDataType pointDataType)
//            throws ArgumentErrorException, UniqueConstraintsException, ObjectNotFoundException {
//        boolean exists = pointDataType.getId() != null && pointDataTypeRepository.existsById(pointDataType.getId());
//        if (!exists) {
//            throw new ObjectNotFoundException("找不到ID为" + pointDataType.getId() + "的点号数据类型");
//        }
//        processBeforeSave(pointDataType);
//        return pointDataTypeRepository.save(pointDataType);
//    }
//
//    /**
//     * 更新点号数据类型（更新指定字段）
//     * @param pointDataTypeId 点号数据类型ID
//     * @param code 代码
//     * @param name 编号
//     * @param title 标题
//     * @param sn 排序序号
//     * @param activity 是否可用
//     * @param unit
//     */
//    @Override
//    @Transactional
//    public PointDataType updatePointDataType(Long pointDataTypeId,
//                                             Long code,
//                                             String name,
//                                             String title,
//                                             Long sn,
//                                             Boolean activity,
//                                             String unit)
//            throws ArgumentErrorException, ObjectNotFoundException, UniqueConstraintsException {
//        PointDataType pointDataType = this.findByPointDataTypeId(pointDataTypeId);
//        if (pointDataType == null) {
//            throw new ObjectNotFoundException("找不到ID为" + pointDataTypeId + "的点号数据类型");
//        }
//        Optional.ofNullable(code).ifPresent(pointDataType::setCode);
//        Optional.ofNullable(name).ifPresent(pointDataType::setName);
//        Optional.ofNullable(title).ifPresent(pointDataType::setTitle);
//        Optional.ofNullable(sn).ifPresent(pointDataType::setSn);
//        Optional.ofNullable(activity).ifPresent(pointDataType::setActivity);
//        Optional.ofNullable(unit).ifPresent(pointDataType::setUnit);
//        processBeforeSave(pointDataType);
//        return pointDataTypeRepository.save(pointDataType);
//    }
//
//    /**
//     * 根据ID获得点号数据类型对象
//     * @param id 状态ID
//     */
//    @Override
//    public PointDataType findByPointDataTypeId(Long id) {
//        return pointDataTypeRepository.findById(id).orElse(null);
//    }
//
//    /**
//     * 根据代码获得点号数据类型对象
//     * @param code 代码
//     */
//    @Override
//    public PointDataType findByCode(Long code) {
//        return pointDataTypeRepository.findByCode(code);
//    }
//
//    /**
//     * 根据编号获得点号数据类型对象
//     * @param name 编号
//     */
//    @Override
//    public PointDataType findByName(String name) {
//        return pointDataTypeRepository.findByName(name);
//    }
//
//    /**
//     * 获得全部点号数据类型对象
//     */
//    @Override
//    public Iterable<PointDataType> findPointDataTypes() {
//        return pointDataTypeRepository.findAll(QueryUtil.defaultSort());
//    }
//
//    /**
//     * 根据代码绑定四遥类型
//     * @param code 代码
//     * @param pointMeasureTypeCode 四遥类型代码
//     */
//    @Override
//    @Transactional
//    public void bindPointMeasureTypeByCode(Long code, Long pointMeasureTypeCode)
//            throws DatabaseProcessException {
//        pointDataTypeRepository.bindPointMeasureTypeByCode(code, pointMeasureTypeCode);
//    }
//
//    /**
//     * 根据代码解绑四遥类型
//     * @param code 代码
//     * @param pointMeasureTypeCode 四遥类型代码
//     */
//    @Override
//    @Transactional
//    public void unbindPointMeasureTypeByCode(Long code, Long pointMeasureTypeCode)
//            throws DatabaseProcessException {
//        pointDataTypeRepository.unbindPointMeasureTypeByCode(code, pointMeasureTypeCode);
//    }
//
//    /**
//     * 更新四遥类型（根据代码）
//     * @param code 代码
//     * @param pointMeasureTypeCodes 四遥类型代码
//     */
//    @Override
//    public void updatePointMeasureTypeByCode(Long code, List<Long> pointMeasureTypeCodes)
//            throws DatabaseProcessException {
//        pointDataTypeRepository.unbindAllPointMeasureTypesByCode(code);
//        if (pointMeasureTypeCodes != null && pointMeasureTypeCodes.size() > 0) {
//            pointDataTypeRepository.unbindAllPointMeasureTypesByCode(code);
//            for (Long pointMeasureTypeCode : pointMeasureTypeCodes) {
//                pointDataTypeRepository.bindPointMeasureTypeByCode(code, pointMeasureTypeCode);
//            }
//        }
//    }
//
//    /**
//     * 获取所有四遥类型（根据代码）
//     * @param code 代码
//     */
//    @Override
//    public Iterable<PointMeasureType> getPointMeasureTypeByCode(Long code) {
//        return pointDataTypeRepository.getPointMeasureTypeByCode(code);
//    }
//
//    @Override
//    public void updateAnalogStatus(Long id, Long analogStatusId) {
//        pointDataTypeRepository.unbindAnalogStatus(id);
//        pointDataTypeRepository.bindAnalogStatus(id, analogStatusId);
//    }
//
//    @Override
//    public void bindAnalogStatusByCode(Long code, Long analogStatusCode) {
//        pointDataTypeRepository.bindAnalogStatusByCode(code, analogStatusCode);
//    }
//
//    @Override
//    public void unbindAnalogStatusByCode(Long code, Long analogStatusCode) {
//        pointDataTypeRepository.unbindAnalogStatusByCode(code, analogStatusCode);
//    }
//
//    @Override
//    public Long getFrequencyByCode(Long code) {
//        return pointDataTypeRepository.getFrequencyByCode(code);
//    }
//}
